﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


/** 
 ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
 * Description: 
 * Author: Heller (HellerSong@outlook.com)
 * CreationTime: 3/4/2015 2:14:32 PM
 ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** 
 **/
namespace DevAlogrithm.Alogrithm
{
    public enum SortMode { Assending, Descending };
    public class Sort
    {
        //private static void swap(ref int i, ref int j)        // 不具有各语言de通用性
        //{
        //    int temp;
        //    temp = i;
        //    i = j;
        //    j = temp;
        //}
        private static void Swap(int[] dataList, int x, int y)
        {
            if (dataList == null || x == null || y == null)
                return;
            if (dataList.Length == 0)
                return;
            if (x < 0 || y < 0)
                return;

            int temp;
            temp = dataList[x];
            dataList[x] = dataList[y];
            dataList[y] = temp;
        }
        /// <summary>
        /// 第一趟，从第一个元素开始，最小的数升到最顶
        /// 第二趟，从第二个元素开始，次小的数升到最顶
        /// 最少比较（正序）： n-1次
        /// 最多比较（逆序）： n*(n-1)/2次
        /// 时间复杂度：O(n*n)
        /// </summary>
        /// <param name="dataList"></param>
        /// <param name="sortMode">Ascending(Default) or Descending</param>
        public static void BubbleSort(int[] dataList, params SortMode[] sortMode)
        {
            if (dataList == null)       // Check not null
                return;
            if (dataList.Length == 0)   // Check data validate
                return;

            for (int i = 0; i < dataList.Length; i++)
                for (int j = i + 1; j < dataList.Length; j++)
                    if (sortMode.Length == 0)   // Default is ascending modle
                    {
                        if (dataList[i] > dataList[j])
                            Swap(dataList, i, j);
                    }
                    else
                        if (dataList[i] < dataList[j])  // Descending Modle
                            Swap(dataList, i, j);
        }


    }
}
